package main

/*
1、什么是package
是Go语言中用来组织源码，是多个go源码的集合，是基本可复用模块儿，可以类比 PHP里面某个命名空间，import 一个包，就相当于 use 一个命名空间进来。
2、Go的包管理方案
Go有 GOMOD 和 GOPATH 两种包管理方案，互不兼容。
在GOPATH下查包，按照GOROOT和多个GOPATH目录下的 src/xxx 依次查找。
在GOMOD下查包，解析go.mod文件，mod包名就是报的前缀，里面的目录就是后续路径。(go mod能添加依赖，删除不用的依赖)
3、每个源码文件必须声明所属package，同个目录下的源文件所属的包是一致的，package的名称和源文件的文件名没有关系，可以不一样
4、同一个package下的结构体、函数等等可以直接调用，同个package下的代码透明，想要带有其他package下的东西，需要现导入package
5、可见性
如果想让一个包中的标识符（如变量、常量、类型、函数等）能被外部的包使用，那么标识符必须是对外可见的（public）。
在Go语言中是通过标识符的首字母大/小写来控制标识符的对外可见（public）/不可见（private）的。在一个包内部只有首字母大写的标识符才是对外可见的。
6、自定义包别名或匿名导入包
导入包名的时候，我们还可以为导入的包设置别名。通常用于导入的包名太长或者导入的包名冲突的情况。具体语法格式如下：import 别名 "包的路径"
如果只希望导入包，而不使用包内部的数据时，可以使用匿名导入包。具体的格式如下：import _ "包的路径"
7、全局声明——> init()——> main()
在main被执行前，所有依赖的package的init()方法都会被执行,不同包的init()按照包导入的依赖关系决定执行顺序，每个包可以有多个init()，包的每个源⽂件也可以有多个init()。
四、总结




*/

//导入其他package，当然这里也可以使用自定义包别名，包名的路径不能有中文
import (
	"fmt"
	"learn_go/12_package_imort/user"     //导入包所在的路径
	. "learn_go/12_package_imort/user"   //把其他package下的东西导入自己的package,使用的时候不用加前缀，但代码可读性差，少用
	_ "learn_go/12_package_imort/user"   //只导入不使用，这个可以和init()函数配合使用，实现一些初始化，init()函数的先执行于main
	u01 "learn_go/12_package_imort/user" //导入时设置包的别名
)

func main() {
	//package被导入之后，对应可以对外可见的结构体进行调用，包名.被调用的名称
	per1 := couse.Person{Name: "jiang", Age: 18}
	//调用其他package下的函数
	couse.GetPerson(per1)
	fmt.Println(per1)

	//别名方式
	per2 := u01.Person{Name: "jiang", Age: 18}
	u01.GetPerson(per2)

	//.方式
	per3 := Person{Name: "jiang", Age: 18}
	GetPerson(per3)
}
